package cn.kgc.spring04.interfce.impl;

import cn.kgc.spring04.interfce.Teacher;
import lombok.Data;
import lombok.ToString;

/**
 * @Author: 课工场
 * @Version: v1.0  2023/2/20
 * @Description:  教学任务分析
 * 通过代码的改写，实现功能的增强   上下课提醒
 * 1.实现业务功能时 修改了原始代码 违背了代码编写的开闭原则
 * 2.代码的冗余
 *
 * 能否实现 在不修改源码的基础上实现代码功能的增强
 * 解决：  代理  23设计模式之一
 * 分类：
 *  1.静态代理
 *      1.1 被代理类  TeacherA
 *      1.2 代理类   TeacherAStaticProxy
 *          设计的原则：
 *              1.代理类和被代理类要实现相同的接口   保证方法的统一  实现解耦
 *              2.代理类要依赖被代理类  注入被代理类
 *        存在的问题：
 *          1.代码冗余
 *          2.增加了代码的维护难度
 *  2.动态代理
 *         不需要显示的创建代理类 程序运行的过程中动态的创建代理类
 *      2.1 JDK    基于接口代理模式  动态代理类也要和被代理类实现系统的接口
 *          1.获取代理对象  TeacherA
 *
 *      2.2 cglib  基于父子类的代理模式  User  UserA
 *         Enhancer enhancer = new Enhancer();
 *         enhancer.setClassLoader()
 *         enhancer.setSuperclass()
 *         enhancer.setCallback()     MethodInterceptor methodInterceptor
 *         enhancer.create()
 */
public class TeacherA implements Teacher {

    @Override
    public String teachOnLine(String course) {

        System.out.println("开始"+course+"课程线上教学");

        return course+"课程线上教学";
    }

    @Override
    public String teachOffLine(String course) {

        System.out.println("开始"+course+"课程线下教学");

        return course+"课程线线下教学";
    }

    public String toString(){

        return "hello jdk proxy";
    }
}
